<html>
<head>
  <title>Evernote Export</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="YXBJ Windows/602498 (zh-CN, DDL); Windows/10.0.0 (Win64); EDAMVersion=V2;"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="564"/>

<div>
<span><div><div><div>Spring时分层的Jva SE/EE应用 full-stack(全栈式) 轻量级开源框架</div><div><br/></div><div>full-stack:它对各种主流技术和框架都进行了整合  同时对三层框架都提供解决方案</div><div>轻量级：轻量级和重量级的划分主要依据就是看它使用了多少服务，启动时需要加载的资源多少以及耦合度等等</div><div><br/></div><div>两大核心：</div><div>IOC: 控制反转：把对象的创建权交给spring</div><div>AOP:面向切面编程：在不修改源代码的情况下 对方法进行增强</div><div><br/></div><div>耦合：程序间的依赖关系  </div><div>解耦：降低程序间的依赖关系   体现：编译期不依赖  运行期才依赖</div><div>只要看到new，那么就会存在编译期依赖 耦合重的体现 如何解耦：通过方法去掉new关键字</div><div>解耦思路：配置文件+反射</div><div><br/></div><div>如何解决耦合和硬编码问题？</div><ol><li><div>准备一个配置文件 beans.xml</div></li><li><div>编写一个工厂工具类 工厂类中使用dom4j来解析配置文件，获取到类全路径</div></li><li><div>使用反射生成对应类的实例对象 存到map中(IOC容器)</div></li></ol><div><br/></div><div>Spring配置文件：</div><div>&lt; bean id=&quot;&quot; class=&quot;&quot; &gt;</div><ol><li><div>用于配置对象交由Spring来创建。</div></li><li><div>基本属性：</div></li><ol><li><div>id：Bean实例在Spring容器中的唯一标识</div></li><li><div>class：Bean的全限定名</div></li></ol><li><div>默认情况下它调用的是类中的 无参构造函数，如果没有无参构造函数则不能创建成功。</div></li></ol><div><br/></div><div>Bean标签范围配置:</div><ol><li><div>singleton 默认值，单例的</div></li><li><div>prototype 多例的</div></li></ol><div><br/></div><div>当scope的取值为singleton时:</div><ol><li><div>Bean的实例化个数：1个</div></li><li><div>Bean的实例化时机：当Spring核心文件被加载时，实例化配置的Bean实例</div></li><li><div>Bean的生命周期：</div></li><ol><li><div>对象创建：当应用加载，创建容器时，对象就被创建了</div></li><li><div>对象运行：只要容器在，对象一直活着</div></li><li><div>对象销毁：当应用卸载，销毁容器时，对象就被销毁了</div></li></ol></ol><div><br/></div><div><br/></div><div>当scope的取值为prototype时</div><ol><li><div>Bean的实例化个数：多个</div></li><li><div>Bean的实例化时机：当调用getBean()方法时实例化Bean</div></li><li><div>Bean的生命周期：</div></li><ol><li><div>对象创建：当使用对象时，创建新的对象实例</div></li><li><div>对象运行：只要对象在使用中，就一直活着</div></li><li><div>对象销毁：当对象长时间不用时，被 Java 的垃圾回收器回收了</div></li></ol></ol><div><br/></div><div>Bean生命周期配置</div><div>&lt; bean id=&quot;&quot; class=&quot;&quot; scope=&quot;&quot; init-method=&quot;&quot; destroy-method=&quot;&quot; &gt;</div><ol><li><div>init-method：指定类中的初始化方法名称</div></li><li><div>destroy-method：指定类中销毁方法名称</div></li></ol><div><br/></div><div>Bean实例化三种方式</div><ol><li><div>无参构造方法实例化</div></li><li><div>工厂静态方法实例化</div></li><li><div>工厂普通方法实例化</div></li></ol><div><br/></div><div><br/></div><div>P命名空间注入: P命名空间注入本质也是set方法注入，但比起上述的set方法注入更加方便，主要体现在配置文件 中</div><div><br/></div><div><br/></div><div><br/></div><div>Spring注解</div></div><div>@Component  :使用在类上用于实例化Bean</div><div>@Controller   :使用在web层类上用于实例化Bean</div><div>@Service    :使用在service层类上用于实例化Bean</div><div>@Repository    :使用在dao层类上用于实例化Bean</div><div>@Autowired : 使用在字段上用于实例化Bean</div><div>@Qualifier : 结合@Autowired一起使用，根据名称进行注入依赖</div><div>@Resource  ：相当于@Autowired+@Qualifier，按照名称进行注入</div><div>@Value  ： 注入普通属性</div><div>@Scope  :  标注Bean的作用范围    相当于配置了scope属性   作用：指定bean的作用范围</div><div>@PostConstruct  :   使用在方法上标注该方法时Bean的初始化方法  相当于init-method</div><div>@PreDestroy   :   使用在方法上标注该方法时Bean的销毁方法  相当于destory-method</div><div><br/></div><div>注意：@Component   @Controller   @Service   @Repository 这四个注解相当于配置了&lt;bean&gt; 生成类的实例对象注入到IOC容器中</div><div>@Autowired   @Qualifier   @Resource 这三个注解是注入引用类型的 相当于ref</div><div>在使用注解时： 需要在applicationContext.xml中配置组件扫描，作用是指定哪个包及其子包 下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。</div><div>eg:&lt; context:component-scan base-package=&quot;com.lagou&quot;&gt; &gt;</div><div><br/></div><div>Spring新注解</div><div>使用上面的注解还不能全部替代xml配置文件，还需要使用注解替代的配置如下：</div><ol><li><div>非自定义的Bean的配置：&lt;bean&gt;</div></li><li><div>加载properties文件的配置：&lt; context:property-placeholder &gt;</div></li><li><div>组件扫描的配置：&lt; context:component-sca n&gt;</div></li><li><div>引入其他文件：&lt; import &gt;</div></li></ol><div><br/></div><div>@Configuration 用于指定当前类是一个Spring 配置类，当创建容器时会从该类上加载注解   被该注解标注的类就是核心配置类</div><div>@Bean                       使用在方法上，标注将该方法的返回值存储到 Spring 容器中</div><div>@PropertySource      用于加载 properties 文件中的配置</div><div>@ComponentScan    用于指定 Spring 在初始化容器时要扫描的包</div><div>@Import                    用于导入其他配置类</div><div><br/></div><div><br/></div><div>Spring纯注解整合DbUtils</div><ol><li><div>编写Spring核心配置类</div></li><li><div>编写数据库配置信息类</div></li><li><div>编写测试代码</div></li></ol><div><br/></div><div><br/></div><div><br/></div><div>Spring整合Junit</div><ol><li><div>导入spring集成Junit的坐标</div></li><li><div>使用@Runwith注解替换原来的运行器</div></li><li><div>使用@ContextConfiguration指定配置文件或配置类</div></li><li><div>使用@Autowired注入需要测试的对象</div></li><li><div>创建测试方法进行测试</div></li></ol><div><br/></div><div><br/></div><div>spring集成Junit的坐标</div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;dependency&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;groupId&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">junit</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/groupId&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;artifactId&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">junit</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/artifactId&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;version&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">4.12</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/version&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/dependency&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;dependency&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;groupId&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">org.springframework</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/groupId&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;artifactId&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">spring-test</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/artifactId&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;version&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">5.1.5.RELEASE</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/version&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/dependency&gt;</span></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div>@Runwith:配置运行环境</div><div>@ContextConfiguration：指定配置文件或配置类</div><div><br/></div><div>AOP： 面向切面编程</div><div>AOP 是 OOP（面向对象编程） 的延续，是软件开发中的一个热点，也是Spring框架中的一个重要内 容，利用AOP可以对业务逻辑的各个部分进行隔离，从而使得业务逻辑各部分之间的耦合度降低，提高 程序的可重用性，同时提高了开发的效率。</div><div>优点：</div><ol><li><div>在程序运行期间，在不修改源码的情况下对方法进行功能增强</div></li><li><div>逻辑清晰，开发核心业务的时候，不必关注增强业务的代码</div></li><li><div>减少重复代码，提高开发效率，便于后期维护</div></li></ol><div><br/></div><div><br/></div><div>AOP底层实现：AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间，Spring通过动态代 理技术动态的生成代理对象，代理对象方法执行时进行增强功能的介入，在去调用目标对象的方法，从 而完成功能的增强。</div><div><br/></div><div>Sping AOP相关术语</div><div><br/></div><div>Target目标对象)：被代理类</div><div>Proxy(代理)：生成代理对象</div><div>Joinpoint(连接点)：可以被拦截增强的方法</div><div>Pointcut(切入点)：真正被拦截增强的方法</div><div>Advid(通知/增强)：增强的业务逻辑</div><div>    分类：前置通知；后置通知；异常通知；最终通知；环绕通知</div><div><br/></div><div>Aspect(切面)：是切入点和通知(引介)的结合</div><div>Weaving(织入)：是指把增强应用到u表对象来创建新的代理对象的过程</div><div><br/></div><div>AOP开发明确事项</div><div>开发阶段（我们做的）</div><ol><li><div>. 编写核心业务代码（目标类的目标方法） 切入点</div></li><li><div>把公用代码抽取出来，制作成通知（增强功能方法） 通知</div></li><li><div>在配置文件中，声明切入点与通知间的关系，即切面</div></li></ol><div><br/></div><div><br/></div><div>运行阶段（Spring框架完成的）：<span style="font-size: unset; color: unset; font-family: unset;">Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行，使用代理机制，动态创建目标对 象的代理对象，根据通知类别，在代理对象的对应位置，将通知对应的功能织入，完成完整的代码逻辑 运行。</span></div><div><span style="font-size: unset;"><br/></span></div><div><span style="font-size: unset;"><br/></span></div><div>底层代理实现</div><div>在 Spring 中，框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。</div><ol><li><div>当bean实现接口时，会用JDK代理模式</div></li><li><div>当bean没有实现接口，用cglib实现（ 可以强制使用cglib（在spring配置中加入）</div></li></ol><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div>基于XML的AOP开发</div><div>开发步骤</div><ol><li><div>创建java项目，导入AOP相关坐标</div></li><li><div>创建目标接口和目标实现类（定义切入点）</div></li><li><div>创建通知类及方法（定义通知）</div></li><li><div>将目标类和通知类对象创建权交给spring</div></li><li><div>在核心配置文件中配置织入关系，及切面</div></li><li><div>编写测试代码</div></li></ol><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div>Spring切入点表达式详解</div><div><br/></div><div><br/></div><div>切点表达式</div><div>表达式语法： execution([修饰符] 返回值类型 包名.类名.方法名(参数))</div><ol><li><div>访问修饰符可以省略</div></li><li><div>返回值类型、包名、类名、方法名可以使用星号 * 代替，代表任意</div></li><li><div>包名与类名之间一个点 . 代表当前包下的类，两个点 .. 表示当前包及其子包下的类</div></li><li><div>参数列表可以使用两个点 .. 表示任意个数，任意类型的参数列表</div></li></ol><div><br/></div><div>切点表达式抽取: 当多个增强的切点表达式相同时，可以将切点表达式进行抽取，在增强中使用 pointcut-ref 属性代替 pointcut 属性来引用抽取后的切点表达式。</div><div><br/></div><div>通知的配置语法：</div><div>&lt; aop:通知类型 method=“通知类中方法名” pointcut=“切点表达式&quot;&gt; </div><div><br/></div><div><br/></div><div>前置通知      &lt; aop:before &gt;          用于配置前置通知。指定增强的方法在切入点方法之前执 行</div><div><br/></div><div>后置通知     &lt; aop:afterReturning &gt;           用于配置后置通知。指定增强的方法在切入点方法之后执 行</div><div><br/></div><div>异常通知     &lt; aop:afterThrowing &gt;           用于配置异常通知。指定增强的方法出现异常后执行</div><div><br/></div><div>最终通知      &lt; aop:after &gt;                      用于配置最终通知。无论切入点方法执行时是否有异常， 都会执行</div><div><br/></div><div>环绕通知      &lt; aop:around &gt;                 用于配置环绕通知。开发者可以手动控制增强代码在什么 时候执行</div><div><br/></div><div><br/></div><div>aop织入的配置</div><div>    &lt; aop:config &gt;</div><div>            &lt; aop:aspect ref=“通知类”&gt;</div><div>                    &lt; aop:before method=“通知方法名称” pointcut=“切点表达式&quot;&gt;</div><div>            &lt; /aop:aspect &gt;</div><div>    &lt; /aop:config &gt;</div><div><br/></div><div>通知的类型: 前置通知、后置通知、异常通知、最终通知、环绕通知</div><div><br/></div><div><br/></div><div><br/></div><div>基于注解的AOP开发</div><div>开发步骤</div><ol><li><div>创建java项目，导入AOP相关坐标</div></li><li><div>创建目标接口和目标实现类（定义切入点）</div></li><li><div>创建通知类（定义通知）</div></li><li><div>将目标类和通知类对象创建权交给spring</div></li><li><div>在通知类中使用注解配置织入关系，升级为切面类</div></li><li><div>在配置文件中开启组件扫描和 AOP 的自动代理</div></li><li><div>编写测试代码</div></li></ol><div><br/></div><div>总结：</div><div>    使用@Aspect注解，标注切面类</div><div>    使用@Before等注解，标注通知方法</div><div>    使用@Pointcut注解，抽取切点表达式</div><div>    配置aop自动代理&lt; aop:aspectj-autoproxy/ &gt; 或 @EnableAspectJAutoProxy</div><div><br/></div><div><br/></div><div><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">目标类交给</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">IOC</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">容器</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;bean</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">id</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;accountService&quot;</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">class</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;com.lagou.service.impl.AccountServiceImpl&quot;</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&gt;&lt;/bean&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知类交给</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">IOC</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">容器</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;bean</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">id</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;myAdvice&quot;</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">class</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;com.lagou.advice.MyAdvice&quot;</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&gt;&lt;/bean&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">表达式语法：</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution([</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">修饰符</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">]</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">返回值类型 包名</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">.</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">类名</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">.</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">方法名</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">(</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">参数</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">))</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution(public void com.lagou.service.impl.AccountServiceImpl.transfer(java.lang.String))</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">访问修饰符可以省略</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution(void com.lagou.service.impl.AccountServiceImpl.transfer(java.lang.String))</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">返回值类型、包名、类名、方法名可以使用星号</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">*</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">代替，代表任意</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution(* *.*.*.*.*.*())</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">包名与类名之间一个点</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">.</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">代表当前包下的类，两个点</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">..</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">表示当前包及其子包下的类</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution(* *..*.*())</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">参数列表可以使用两个点</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">..</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">表示任意个数，任意类型的参数列表</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">execution(* *..*.*(..))</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><br/></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--AOP</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">配置</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:config&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">抽取切点表达式</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:pointcut</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">id</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;myPointcut&quot;</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">expression</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;execution(* com.lagou.service.impl.AccountServiceImpl.*(..))&quot;</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">/&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">配置切面：切入点</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">+</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">指定通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--&lt;aop:aspect ref=&quot;</span><span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知类</span><span style="background-color: rgb(43, 43, 43); font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&quot;&gt;--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:aspect</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">ref</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;myAdvice&quot;</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知的配置语法：</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;aop:</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知类型</span> <span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">method=“</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知类中方法名</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">” pointcut=“</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">切点表达式</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&quot;&gt;&lt;/aop:</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">通知类型</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&gt;--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">指定通知类的哪个方法为增强方法</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--pointcut</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">：配置切入点</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">配置目标类的</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">transfer</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">方法执行时会使用</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">MyAdvice</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">类中的</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">before</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">方法做一个前置增强</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">前置通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--&lt;aop:before method=&quot;before&quot; pointcut-ref=&quot;myPointcut&quot;&gt;&lt;/aop:before&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;lt;!&amp;ndash;</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">后置通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;ndash;&amp;gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;aop:after-returning method=&quot;afterReturning&quot; pointcut-ref=&quot;myPointcut&quot;&gt;&lt;/aop:after-returning&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;lt;!&amp;ndash;</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">异常通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;ndash;&amp;gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;aop:after-throwing method=&quot;afterThrowing&quot; pointcut-ref=&quot;myPointcut&quot;&gt;&lt;/aop:after-throwing&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;lt;!&amp;ndash;</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">最终通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&amp;ndash;&amp;gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;aop:after method=&quot;after&quot; pointcut-ref=&quot;myPointcut&quot;&gt;&lt;/aop:after&gt;--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">&lt;!--</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;;">环绕通知</span><span style="font-size: 13.5pt; color: rgb(128, 128, 128); font-family: Consolas;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:around</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">method</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;around&quot;</span> <span style="font-size: 13.5pt; color: rgb(186, 186, 186); font-family: Consolas;">pointcut-ref</span><span style="font-size: 13.5pt; color: rgb(106, 135, 89); font-family: Consolas;">=&quot;myPointcut&quot;</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&gt;&lt;/</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:around&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;/</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:aspect&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;/</span><span style="font-size: 13.5pt; color: rgb(152, 118, 170); font-family: Consolas;">aop</span><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">:config&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="font-size: 13.5pt; color: rgb(232, 191, 106); font-family: Consolas;">&lt;/beans&gt;</span></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div>Spring的JdbcTemplate： JdbcTemplate是spring框架中提供的一个模板对象，是对原始繁琐的Jdbc API对象的简单封装。</div><div>核心对象： JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSource dataSource);</div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div>Spring编程事务控制： Spring的事务控制可以分为编程式事务控制和声明式事务控制。</div><div>编程式： 开发者直接把事务的代码和业务代码耦合到一起，在实际开发中不用。</div><div>声明式： 开发者采用配置的方式来实现的事务控制，业务代码与事务代码实现解耦合，使用的AOP思想。</div><div><br/></div><div>事务隔离级别</div><div>设置隔离级别，可以解决事务并发产生的问题，如脏读、不可重复读和虚读（幻读）</div><ol><li><div>ISOLATION_DEFAULT 使用数据库默认级别</div></li><li><div>ISOLATION_READ_UNCOMMITTED 读未提交</div></li><li><div>ISOLATION_READ_COMMITTED 读已提交</div></li><li><div>ISOLATION_REPEATABLE_READ 可重复读</div></li><li><div>ISOLATION_SERIALIZABLE 串行化</div></li></ol><div><br/></div><div><br/></div><div>事务传播行为：</div><div>REQUIRED:   如果当前没有事务，就新建一个事务，如果已经存在一个事务中，加入到这个事务中。一般的选择（默认值）</div><div>                        transfer方法执行时，判断testPropagationTrans方法有没有被事务控制，如果没有，就新建一个事务</div><div>                                                                                                                                        如果有事务：就加入到这个事务当中</div><div>            举例：领导没饭吃，但是我有钱，我只会买了给自己吃，但是如果领导有钱，领导会分给我一起吃    总结：当前被调用的方法必须进行事务控制   增删改操作</div><div><br/></div><div>SUPPORTS: 支持当前事务，如果当前没有事务，就以非事务方式执行（没有事务）</div><div>                    transfer方法执行时，判断testPropagationTrans方法有没有被事务控制，如果没有，就以非事务的方式执行</div><div>                                                                                                            如果有事务：就加入到这个事务当中   总结：当前被调用的方法不管有没有事务控制都可以执行   查询操作</div><div>举例：领导没饭吃，我也没饭吃，领导有饭吃，我就有饭吃</div><div>                    </div><div>read-only（是否只读）：建议查询时设置为只读</div><div><span style="font-size: unset; color: unset; font-family: unset;">timeout（超时时间）：默认值是-1，没有超时限制。如果有，以秒为单位进行设置</span></div><div><span style="font-size: unset;"><br/></span></div><div><span style="font-size: unset;"><br/></span></div><div><span style="font-size: unset;"><br/></span></div><div>基于XML的声明式事务控制(重点)： 在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。底层采用AOP思想来实现的。</div><div><br/></div><div>声明式事务控制明确事项：</div><ol><li><div>核心业务代码(目标对象) （切入点是谁？）</div></li><li><div>事务增强代码(Spring已提供事务管理器)）（通知是谁？）</div></li><li><div>切面配置（切面如何配置？）</div></li></ol><div><br/></div><div>使用spring声明式事务控制转账业务 步骤分析</div><ol><li><div>引入tx命名空间</div></li><li><div>事务管理器通知配置</div></li><li><div>事务管理器AOP配置</div></li><li><div>测试事务控制转账业务代码</div></li></ol><div><br/></div><div><br/></div><div>事务参数的配置详解</div><div>EG:&lt; tx:method name=&quot;transfer&quot; isolation=&quot;REPEATABLE_READ&quot; propagation=&quot;REQUIRED&quot; timeout=&quot;-1&quot; read-only=&quot;false&quot;/ &gt;</div><ol><li><div>name：切点方法名称</div></li><li><div>isolation:事务的隔离级别</div></li><li><div>propogation：事务的传播行为</div></li><li><div>timeout：超时时间</div></li><li><div>ead-only：是否只读</div></li></ol><div><br/></div><div><br/></div><div>crud常用配置：</div><div>&lt;tx: attributes &gt;</div><div>        &lt; tx:method name=&quot;save*&quot; propagation=&quot;REQUIRED&quot;/ &gt;    </div><div>        &lt; tx:method name=&quot;delete*&quot; propagation=&quot;REQUIRED&quot;/ &gt;</div><div>        &lt; tx:method name=&quot;update*&quot; propagation=&quot;REQUIRED&quot;/ &gt;</div><div>        &lt; tx:method name=&quot;find*&quot; read-only=&quot;true&quot;/ &gt;</div><div>        &lt; tx:method name=&quot;*&quot;/ &gt;</div><div>&lt; /tx:attributes &gt;</div><div><br/></div><div><br/></div><div>基于注解的声明式事务控制(重点)</div><div>步骤分析:</div><ol><li><div>修改service层，增加事务注解</div></li><li><div>修改spring核心配置文件，开启事务注解支持</div></li></ol><div><br/></div><div><br/></div><div>Spring集成web环境</div><div>ApplicationContext应用上下文获取方式: 应用上下文对象是通过 new ClasspathXmlApplicationContext(spring配置文件) 方式获取的，但 是每次从容器中获得Bean时都要编写 new ClasspathXmlApplicationContext(spring配置文件) ， 这样的弊端是配置文件加载多次，应用上下文对象创建多次。</div><div><br/></div><div><br/></div><div>解决思路分析： 在Web项目中，可以使用ServletContextListener监听Web应用的启动，我们可以在Web应用启动 时，就加载Spring的配置文件，创建应用上下文对象ApplicationContext，在将其存储到最大的域 servletContext域中，这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。</div><div><br/></div><div>Spring提供获取应用上下文的工具: 上面的分析不用手动实现，Spring提供了一个监听器ContextLoaderListener就是对上述功能的封 装，该监听器内部加载Spring配置文件，创建应用上下文对象，并存储到ServletContext域中，提供 了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。</div><div><br/></div><div>我们只需做两件事；</div><ol><li><div>在web.xml中配置ContextLoaderListener监听器（导入spring-web坐标）</div></li><li><div>使用WebApplicationContextUtils获得应用上下文对象ApplicationContext</div></li></ol><div><br/></div><div>实现</div><ol><li><div>导入Spring集成web的坐标</div></li><li><div>配置ContextLoaderListener监听器</div></li></ol><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">&lt;!--</span><span style="color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;; font-size: 13.5pt;">配置全局参数：指定</span><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">applicationContext.xml</span><span style="color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;; font-size: 13.5pt;">文件的路径</span><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">&lt;!--</span><span style="color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;; font-size: 13.5pt;">配置全局参数</span><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;context-param&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;param-name&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">contextConfigLocation</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/param-name&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;param-value&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">classpath:applicationContext.xml</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/param-value&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/context-param&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">&lt;!--spring</span><span style="color: rgb(128, 128, 128); font-family: &quot;Arial Unicode MS&quot;; font-size: 13.5pt;">监听器</span> <span style="color: rgb(128, 128, 128); font-family: Consolas; font-size: 13.5pt;">contextLoaderListener--&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;listener&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;listener-class&gt;</span><span style="color: rgb(169, 183, 198); font-family: Consolas; font-size: 13.5pt;">org.springframework.web.context.ContextLoaderListener</span><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/listener-class&gt;</span></div><div style="background-color: rgb(43, 43, 43); font-size: 13.5pt;"><span style="color: rgb(232, 191, 106); font-family: Consolas; font-size: 13.5pt;">&lt;/listener&gt;</span></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div></div><div><br/></div></span>
</div></body></html> 